
#ifndef _MY_BATTERY_H_
#define _MY_BATTERY_H_

#include "n32l40x.h"
#include "my_adc_drv.h"
#include "my_gpio.h"

// 充满检测 ---逻辑电平 充电中为低电平， 充满时为高阻态

// #define DC_5V_CHECK_PORT             (GPIOA)
// #define DC_5V_CHECK_PIN              (GPIO_PIN_3)
// #define IS_DC_5V_ONLINE()           (0 == GPIO_ReadInputDataBit(DC_5V_CHECK_PORT, DC_5V_CHECK_PIN))

/***************
 * 充电芯片 IP2313
 *  充电状态脚位： 未充满时 0.5Shz 闪烁【250ms 高+ 250ms低】/ [500ms高+500ms低]
 *                充满时， 常亮
 *
 * */

#define CHARGE_STA_PORT (GPIOB)
#define CHARGE_STA_PIN (GPIO_PIN_6)

#define IS_CHARGING_STA() (1 == GPIO_ReadInputDataBit(CHARGE_STA_PORT, CHARGE_STA_PIN))

// 充电使能--- 硬件V1.1版本呢不再控制充电使能脚
// #define CHARGE_EN_PORT              (GPIOC)
// #define CHARGE_EN_PIN               (GPIO_PIN_13)

// #define BAT_CHARGE_ENABLE()         (set_pin_high(CHARGE_EN_PORT, CHARGE_EN_PIN))
// #define BAT_CHARGE_DISABLE()        (set_pin_low(CHARGE_EN_PORT, CHARGE_EN_PIN))

#define ADC_BUFF_MAX_CNT (20)

typedef enum
{
    BAT_IDLE_STA = 0,
    WORKING_STA,
    CHARGING_STA,
    CHARG_FULL_STA,
} BAT_STATUS_e;

typedef enum
{
    LEVEL_EMETY = 0,
    LEVEL_LOW,
    LEVEL_MID,
    LEVEL_FULL,
} BAT_LEVEL_e;

typedef struct my_battery
{
    /* data */
    uint8_t first_read_flag;
    uint8_t charge_flag;
    uint8_t charge_full_flag;
    uint8_t adc_buff_index;
    uint8_t voltage_buff_index;

    BAT_STATUS_e sta;
    BAT_LEVEL_e level;
    uint16_t bat_voltage; // 扩大100倍，如3.95v  ---395；
    uint16_t bat_min_vol; // 电池电压的最小值，保证电池在使用的过程中，只将不升
    uint32_t bat_adc_buff[ADC_BUFF_MAX_CNT];
    uint32_t bat_vol_buff[ADC_BUFF_MAX_CNT]; // 测试时发现 偶尔电池被拉到很低的值，所以多用几组数据滤波

} BAT_PARAM_t;

void bubble_sort(int *arr, int size);

void my_battery_status_check(void);

int battery_charge_sta_get(void);

void my_battery_scanf(void);
void my_battery_deinit(void);
void my_battery_init(void);

#endif
